import re
import match as m
import check_report as c
import files_predict as f
import os

class UserGuide:
    def __init__(self):
        self.help_text = {
            "command_line_params": {
                "-p": "用于指定待检测的项目路径",
                "check": "启动检测程序",
                "error_rate": "计算并输出系统的误报率"
            },
            "example_input_output": {
                "input": [
                    "如果用户想要将检测结果输出，可以使用如下命令：'-p /path/to/your/project check' 或 'error_rate' 检测误报率"
                ],
                "output": [
                    "检测完成后，输出的报告可能会包含以下信息：",
                    "    - 代码中的潜在木马类型，及其概率分布",
                    "    - 具体的漏洞位置。会给出出现漏洞的文件路径和行号，以便用户快速定位问题",
                    "    - 对漏洞的简要描述。帮助用户理解漏洞的危害和影响"
                ]
            },
            "faq": {
                "检测工具支持哪些编程语言？": "目前支持 Java、Python、Go等常见编程语言。",
                "检测结果的准确性如何？": "检测工具经过严格测试和验证，但由于代码的复杂性和多样性，可能存在一定的误报和漏报情况。建议用户结合实际情况进行分析和判断。",
                "如何提高检测的效率？": "可以在检测前关闭不必要的后台进程，减少系统资源占用。同时，确保输入的源代码结构清晰，避免过多的复杂嵌套和冗余代码。"
            },
            "troubleshooting": [
                "如果用户在使用检测工具时遇到错误提示，可以首先检查以下几个方面：",
                "    - 命令行参数是否正确输入。确保参数的拼写和格式正确，并且路径指向有效的位置。",
                "    - 检测工具是否具有足够的权限访问源代码和输出报告的位置。如果遇到权限问题，可以尝试以管理员身份运行工具或者调整文件权限。",
                "    - 检查系统环境是否满足检测工具的要求。例如，某些工具可能需要特定的运行时环境或库文件。如果缺少必要的组件，可以按照工具的文档说明进行安装和配置。",
                "如果问题仍然无法解决，可以参考在线帮助页面或者联系工具的技术支持团队。提供详细的错误信息和操作步骤，以便技术人员更好地帮助你解决问题。"
            ]
        }

    def show_command_line_params(self):
        print("以下是命令行参数说明：")
        for param, description in self.help_text["command_line_params"].items():
            print(f"{param}: {description}")

    def show_example_input_output(self):
        print("示例输入和输出：")
        print("输入：")
        for example in self.help_text["example_input_output"]["input"]:
            print(f"    {example}")
        print("输出：")
        for example in self.help_text["example_input_output"]["output"]:
            print(f"    {example}")

    def show_faq(self):
        print("常见问题解答（FAQ）：")
        for question, answer in self.help_text["faq"].items():
            print(f"Q: {question}\nA: {answer}\n")

    def show_troubleshooting(self):
        print("故障排除指南：")
        for step in self.help_text["troubleshooting"]:
            print(f"    {step}")

if __name__ == "__main__":
    print('''
                         █                                                                    █                 
███████                                           ████▒           █                    █                        
   █                                              █  ▒█░          █                    █                        
   █     █▒██▒  ███    ███   ░███░  █▒██▒         █   ▒█  ███   █████   ███    ▓██▒  █████  ███     ███   █▒██▒ 
   █     ██  █ █▓ ▓█     █   █▒ ▒█  █▓ ▒█         █    █ ▓▓ ▒█    █    ▓▓ ▒█  ▓█  ▓    █      █    █▓ ▓█  █▓ ▒█ 
   █     █     █   █     █       █  █   █         █    █ █   █    █    █   █  █░       █      █    █   █  █   █ 
   █     █     █   █     █   ▒████  █   █         █    █ █████    █    █████  █        █      █    █   █  █   █ 
   █     █     █   █     █   █▒  █  █   █         █   ▒█ █        █    █      █░       █      █    █   █  █   █ 
   █     █     █▓ ▓█     █   █░ ▓█  █   █         █  ▒█░ ▓▓  █    █░   ▓▓  █  ▓█  ▓    █░     █    █▓ ▓█  █   █ 
   █     █      ███      █   ▒██▒█  █   █         ████▒   ███▒    ▒██   ███▒   ▓██▒    ▒██  █████   ███   █   █ 
                         █                                                                                      
                        ▒█                                                                                      
                       ██▒
''')

    while True:
        # 帮助文档展示
        guide = UserGuide()
        app_on = 0
        user_choice = input("输入begin启动程序，输入help查看说明（第一次使用请查看），输入error_rate检测系统误报率，输入quit结束程序: ")

        if user_choice == 'help':
            # 显示命令行参数帮助说明
            guide.show_command_line_params()

            # 显示示例输入和输出
            guide.show_example_input_output()

            # 显示常见问题解答
            guide.show_faq()

            # 显示故障排除指南
            guide.show_troubleshooting()

            print('\n')

            # 无限循环直到用户输入正确的选项
            while True:
                user_choice = input("输入begin启动程序，输入quit结束程序,输入error_rate检测系统误报率: ")

                if user_choice == "begin":
                    app_on = 1
                    break  # 退出内部循环，进入程序模块

                elif user_choice == "quit":
                    print('''
         # #           #     #       #     #                   #    
         #  #     #   #  #   #       #     #   #     ############   
 #############     # ######  #       ############    #    #    #    
 #       #         # #   #   #      #      #         #    #    #    
 #########           #####   #      #  #########     #    #    #    
 #       #  #        #   #######   ##  #   #   #     ###########    
 # ##### #  #    ### #####   #    # #  #   #   #     #    #    #    
 # #   # # #       # #   #   #      #  #   #   #     #    #    #    
 # #   #  #   #    # #   ##  #      #  #########     #    #    #    
 # ##### # #  #    ####### # #      #  #   #   #     ###########    
#  #    #   ###    #    ## # #      #   #  #         #    #    #    
      #            # # # #   #      #    ##          #    #    #    
  # #  ##  #       ## #  #   #      #     ##         #    #    #    
  # #   # # ##     # #   #   #      #    #  ##      #     #    #    
 #  #     #  #      #  # # # #      #  ##     ###   #     #  # #    
     ######             #   #       # #        #   #          #     

        █                    █                      ▒██                                       █
███████ █                    █                      █░                                                             █
   █    █                    █                      █                                                              █
   █    █▒██▒  ░███░  █▒██▒  █  ▒█  ▒███▒         █████   ███    █▒██▒        █   █  ▒███▒  ███    █▒██▒   ██▓█    █
   █    █▓ ▒█  █▒ ▒█  █▓ ▒█  █ ▒█   █▒ ░█           █    █▓ ▓█   ██  █        █   █  █▒ ░█    █    █▓ ▒█  █▓ ▓█    █
   █    █   █      █  █   █  █▒█    █▒░             █    █   █   █            █   █  █▒░      █    █   █  █   █    █
   █    █   █  ▒████  █   █  ██▓    ░███▒           █    █   █   █            █   █  ░███▒    █    █   █  █   █    █
   █    █   █  █▒  █  █   █  █░█░      ▒█           █    █   █   █            █   █     ▒█    █    █   █  █   █
   █    █   █  █░ ▓█  █   █  █ ░█   █░ ▒█           █    █▓ ▓█   █            █▒ ▓█  █░ ▒█    █    █   █  █▓ ▓█    █
   █    █   █  ▒██▒█  █   █  █  ▒█  ▒███▒           █     ███    █            ▒██▒█  ▒███▒  █████  █   █   ██▒█    █
                                                                                                              █
                                                                                                           ▓ ▒█
                                                                                                           ▒██░
---.          .         .  ..    .  .-..  .  .-.. .. .  . .. .. .  .  .. .---   .---.. .  . . ..-.  .  --.  .  .-.  
 | |-. .-. .-.|_,.-  o  |/\||    |  `-.|\/|  |-. Y  x   |-| Y  Y   |/\| Y  |   (   /  Y   |  Y   ;  |   /   | (  |  
 ' ' '-`-`-' '' `-'  o  '  ''-'  '-'`-''  '  '-' ' ' '  ' ' '  '   '  ' '  '    `-'-- '   '-'' `'   '-''--  '-'`-'-'
                  ''')
                    exit(0)  # 退出程序，返回状态码0
                elif user_choice == "error_rate":
                 # 调用 files_predict 模块的 main 函数计算误报率
                    false_positive_rate = f.main()
                    os.system('cls')
                    print(f"\033[31m系统误报率为：{false_positive_rate:.2%}\033[0m")
                else:
                    print('格式错误，请重新输入')

        elif user_choice == "begin":
            app_on = 1

        elif user_choice == "quit":
            os.system('cls')
            print('''
         # #           #     #       #     #                   #    
         #  #     #   #  #   #       #     #   #     ############   
 #############     # ######  #       ############    #    #    #    
 #       #         # #   #   #      #      #         #    #    #    
 #########           #####   #      #  #########     #    #    #    
 #       #  #        #   #######   ##  #   #   #     ###########    
 # ##### #  #    ### #####   #    # #  #   #   #     #    #    #    
 # #   # # #       # #   #   #      #  #   #   #     #    #    #    
 # #   #  #   #    # #   ##  #      #  #########     #    #    #    
 # ##### # #  #    ####### # #      #  #   #   #     ###########    
#  #    #   ###    #    ## # #      #   #  #         #    #    #    
      #            # # # #   #      #    ##          #    #    #    
  # #  ##  #       ## #  #   #      #     ##         #    #    #    
  # #   # # ##     # #   #   #      #    #  ##      #     #    #    
 #  #     #  #      #  # # # #      #  ##     ###   #     #  # #    
     ######             #   #       # #        #   #          #     

        █                    █                      ▒██                                       █
███████ █                    █                      █░                                                             █
   █    █                    █                      █                                                              █
   █    █▒██▒  ░███░  █▒██▒  █  ▒█  ▒███▒         █████   ███    █▒██▒        █   █  ▒███▒  ███    █▒██▒   ██▓█    █
   █    █▓ ▒█  █▒ ▒█  █▓ ▒█  █ ▒█   █▒ ░█           █    █▓ ▓█   ██  █        █   █  █▒ ░█    █    █▓ ▒█  █▓ ▓█    █
   █    █   █      █  █   █  █▒█    █▒░             █    █   █   █            █   █  █▒░      █    █   █  █   █    █
   █    █   █  ▒████  █   █  ██▓    ░███▒           █    █   █   █            █   █  ░███▒    █    █   █  █   █    █
   █    █   █  █▒  █  █   █  █░█░      ▒█           █    █   █   █            █   █     ▒█    █    █   █  █   █
   █    █   █  █░ ▓█  █   █  █ ░█   █░ ▒█           █    █▓ ▓█   █            █▒ ▓█  █░ ▒█    █    █   █  █▓ ▓█    █
   █    █   █  ▒██▒█  █   █  █  ▒█  ▒███▒           █     ███    █            ▒██▒█  ▒███▒  █████  █   █   ██▒█    █
                                                                                                              █
                                                                                                           ▓ ▒█
                                                                                                           ▒██░
---.          .         .  ..    .  .-..  .  .-.. .. .  . .. .. .  .  .. .---   .---.. .  . . ..-.  .  --.  .  .-.  
 | |-. .-. .-.|_,.-  o  |/\||    |  `-.|\/|  |-. Y  x   |-| Y  Y   |/\| Y  |   (   /  Y   |  Y   ;  |   /   | (  |  
 ' ' '-`-`-' '' `-'  o  '  ''-'  '-'`-''  '  '-' ' ' '  ' ' '  '   '  ' '  '    `-'-- '   '-'' `'   '-''--  '-'`-'-'
                  ''')
            exit(0)  # 退出程序，返回状态码0

        elif user_choice == "error_rate":
            # 调用 files_predict 模块的 main 函数计算误报率
            false_positive_rate = f.main()
            os.system('cls')
            print(f"\033[31m系统误报率为：{false_positive_rate:.2%}\033[0m")

        else:
            print('格式错误，请重新输入')
            continue

        if app_on == 1:
            # 转入程序模块
            m.number = 1
            m.is_virus = False
            user_in = input("请按照指定格式输入:")

            # 使用正则表达式精确提取路径
            program_road_match = re.search(r'-p\s+([^\s]+)\s+check', user_in)
            if program_road_match:
                program_road = program_road_match.group(1)
            else:
                print("路径格式错误，请重新输入")
                continue

            print("检测代码文件路径为：", program_road)
            
            c.analyze_code(program_road)
            print("模式匹配检测结果：")
            m.final_match(program_road)

            print("检测结果已打印")
            print(f"\033[31m该系统误报率为：20%\033[0m")
# -p D:\文件\trojan\source_code_trojan_backdoor_detection\data\train_data\backdoor\trojan_1.py check  